主题
读取图片字节流 - GetImageData
函数简介
获取指定图像的二进制数据,数据格式BBGGRRAA(BGRA),每个像素4字节。
接口名称
GetImageDataDLL调用
int GetImageData(long ola, long ptr, long* data, int* size, int* stride);参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| ola | 长整数型 | OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。 |
| ptr | 长整数型 | OLAImage对象的地址。 |
| data | 长整数型指针 | 返回图片的数据指针。 |
| size | 整数型指针 | 返回图片的数据长度。 |
| stride | 整数型指针 | 返回图片的步长数据(每行数据字节数)。 |
示例
以下示例演示 从 OLAImage 句柄导出 BGRA 原始字节流,并用 stride / size 解析宽高:
width = stride / 4(每像素 4 字节 BGRA)height = size / stride
推荐配合 GetScreenDataPtr 获取句柄(线程安全)。若只需宽高、不需要像素缓冲,也可直接用 GetImageSize。
SDK 调用
cpp
#include "OLAPlugServer.h"
#include <fstream>
OLAPlugServer ola;
long imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if (imgPtr != 0) {
long dataPtr = 0; int size = 0, stride = 0;
if (ola.GetImageData(imgPtr, &dataPtr, &size, &stride) == 1) {
int width = stride / 4; // BGRA:每像素 4 字节
int height = size / stride; // 总字节 / 行字节 = 行数
// 使用 dataPtr / width / height ...
std::ofstream("output/screen.bgra", std::ios::binary).write((const char*)dataPtr, size);
}
ola.FreeImage(imgPtr);
}csharp
using System.IO;
using System.Runtime.InteropServices;
using OLAPlug;
var ola = new OLAPlugServer();
long imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if (imgPtr != 0)
{
if (ola.GetImageData(imgPtr, out long dataPtr, out int size, out int stride) == 1)
{
int width = stride / 4; // BGRA:每像素 4 字节
int height = size / stride; // 总字节 / 行字节 = 行数
byte[] bgra = new byte[size];
Marshal.Copy((IntPtr)dataPtr, bgra, 0, size);
File.WriteAllBytes(@"output\screen.bgra", bgra);
}
ola.FreeImage(imgPtr);
}python
from OLAPlugServer import OLAPlugServer
import ctypes
ola = OLAPlugServer()
img_ptr = ola.GetScreenDataPtr(0, 0, 200, 200)
if img_ptr:
ret, data_ptr, size, stride = ola.GetImageData(img_ptr)
if ret == 1:
width = stride // 4 # BGRA:每像素 4 字节
height = size // stride # 总字节 / 行字节 = 行数
with open("output/screen.bgra", "wb") as f:
f.write((ctypes.c_char * size).from_address(data_ptr))
ola.FreeImage(img_ptr)java
import com.olaplug.OLAPlugServer;
import com.sun.jna.Pointer;
import java.nio.file.Files;
import java.nio.file.Paths;
OLAPlugServer ola = new OLAPlugServer();
long imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if (imgPtr != 0) {
var data = ola.GetImageData(imgPtr);
if (data != null && data.success) {
int stride = data.data.stride;
int size = data.data.size;
int width = stride / 4; // BGRA:每像素 4 字节
int height = size / stride; // 总字节 / 行字节 = 行数
byte[] bgra = new Pointer(data.data.data).getByteArray(0, size);
Files.write(Paths.get("output/screen.bgra"), bgra);
}
ola.FreeImagePtr(imgPtr);
}go
import "github.com/ola/olaplug/olaplug"
ola, _ := olaplug.NewOLAPlugServer("OLAPlug_x64.dll")
defer ola.ReleaseObj()
imgPtr := ola.GetScreenDataPtr(0, 0, 200, 200)
if imgPtr != 0 {
dataPtr := 0; int size = 0, stride = 0
if (ola.GetImageData(imgPtr, &dataPtr, &size, &stride) == 1) {
int width = stride / 4 // BGRA:每像素 4 字节
int height = size / stride // 总字节 / 行字节 = 行数
std::ofstream("output/screen.bgra", std::ios::binary).write((const char*)dataPtr, size)
}
ola.FreeImage(imgPtr)
}rust
use olaplug::OLAPlugServer;
let ola = OLAPlugServer::new("OLAPlug_x64.dll").unwrap();
let imgPtr = ola.get_screen_data_ptr(0, 0, 200, 200);
if imgPtr != 0 {
let dataPtr = 0; int size = 0, stride = 0;
if (ola.get_image_data(imgPtr, &mut dataPtr as *mut i32, &mut size as *mut i32, &mut stride as *mut i32) == 1) {
let width = stride / 4; // BGRA:每像素 4 字节
let height = size / stride; // 总字节 / 行字节 = 行数
std::ofstream("output/screen.bgra", std::ios::binary).write((const char*)dataPtr, size)
}
ola.free_image(imgPtr);
}cpp
var ola = com("OlaPlug.OlaSoft")
var imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200)
if(imgPtr) {
var ret = ola.GetImageData(imgPtr)
var width = ret.stride / 4 // BGRA:每像素 4 字节
var height = ret.size / ret.stride // 总字节 / 行字节 = 行数
ola.WriteBytesToFile("output/screen.bgra", ret.data, ret.size)
ola.FreeImage(imgPtr)
}vbscript
Set ola = CreateObject("OlaPlug.OlaSoft")
imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200)
If imgPtr <> 0 Then
ret = ola.GetImageData(imgPtr)
' ret(0)=data, ret(1)=size, ret(2)=stride
width = ret(2) / 4 ' BGRA:每像素 4 字节
height = ret(1) / ret(2) ' 总字节 / 行字节 = 行数
ola.WriteBytesToFile "output/screen.bgra", ret(0), ret(1)
ola.FreeImage(imgPtr)
End Iftext
.局部变量 ola, OLAPlug
.局部变量 ret, 整数型
.局部变量 imgPtr, 长整数型
.局部变量 dataPtr, 长整数型
.局部变量 bgraData, 字节集
.局部变量 size, 整数型
.局部变量 stride, 整数型
.局部变量 width, 整数型
.局部变量 height, 整数型
ola.创建 ()
imgPtr = ola.GetScreenDataPtr (0, 0, 200, 200)
.如果真 (imgPtr ≠ 0)
ret = ola.GetImageData (imgPtr, dataPtr, size, stride)
.如果真 (ret = 1)
width = stride ÷ 4
height = size ÷ stride
bgraData = 指针到字节集 (dataPtr, size)
写到文件 (“output/screen.bgra”, bgraData)
.如果真结束
ola.FreeImagePtr (imgPtr)
.如果真结束aardio
import OLAPlugServer;
var ola = OLAPlugServer();
var imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if(imgPtr){
var ret, dataPtr, size, stride = ola.GetImageData(imgPtr);
if(ret == 1){
var width = stride / 4; // BGRA:每像素 4 字节
var height = size / stride; // 总字节 / 行字节 = 行数
string(dataPtr, size).save("output/screen.bgra");
}
ola.FreeImage(imgPtr);
}text
变量 ola <类型 = OLAPlugServer>
ola = 新建 OLAPlugServer
长整数 imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200)
如果真 (imgPtr ≠ 0)
{
长整数 dataPtr = 0
整数 size = 0, stride = 0, ret = 0, width = 0, height = 0
ret = ola.GetImageData(imgPtr, dataPtr, size, stride)
如果真 (ret = 1)
{
width = stride / 4
height = size / stride
变量 bgraData <类型 = 字节集类>
bgraData = 指针到字节集(dataPtr, size)
写到文件("output/screen.bgra", bgraData)
}
ola.FreeImagePtr(imgPtr)
}cpp
#include "OLAPlugServer.h"
#include <fstream>
OLAPlugServer ola;
long imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if (imgPtr != 0) {
long dataPtr = 0; int size = 0, stride = 0;
if (ola.GetImageData(imgPtr, &dataPtr, &size, &stride) == 1) {
int width = stride / 4; // BGRA:每像素 4 字节
int height = size / stride; // 总字节 / 行字节 = 行数
std::ofstream("output/screen.bgra", std::ios::binary).write((const char*)dataPtr, size);
}
ola.FreeImage(imgPtr);
}原生 DLL 调用
cpp
long instance = CreateCOLAPlugInterFace();
long imgPtr = GetScreenDataPtr(instance, 0, 0, 200, 200);
if (imgPtr != 0) {
long dataPtr = 0; int size = 0, stride = 0;
if (GetImageData(instance, imgPtr, &dataPtr, &size, &stride) == 1) {
int width = stride / 4; // BGRA:每像素 4 字节
int height = size / stride; // 总字节 / 行字节 = 行数
WriteBytesToFile(instance, "output/screen.bgra", dataPtr, size);
}
FreeImagePtr(instance, imgPtr); // 勿对 dataPtr 调用 FreeImageData
}csharp
long imgPtr = GetScreenDataPtr(instance, 0, 0, 200, 200);
if (imgPtr != 0) {
GetImageData(instance, imgPtr, out long dataPtr, out int size, out int stride);
int width = stride / 4; // BGRA:每像素 4 字节
int height = size / stride; // 总字节 / 行字节 = 行数
byte[] copy = new byte[size];
Marshal.Copy((IntPtr)dataPtr, copy, 0, size);
File.WriteAllBytes(@"output\screen.bgra", copy);
FreeImagePtr(instance, imgPtr);
}python
img_ptr = ola.GetScreenDataPtr(instance, 0, 0, 200, 200)
if img_ptr:
data = c_int64(0); size = c_int(0); stride = c_int(0)
ola.GetImageData(instance, img_ptr, byref(data), byref(size), byref(stride))
width = stride.value // 4 # BGRA:每像素 4 字节
height = size.value // stride.value # 总字节 / 行字节 = 行数
raw = (c_char * size.value).from_address(data.value)
open("output/screen.bgra", "wb").write(raw)
ola.FreeImagePtr(instance, img_ptr)返回值
| 返回值 | 说明 |
|---|---|
1 | 成功。 |
0 | 失败。 |
注意事项
本接口返回的 data 是句柄内部像素视图,不要 调用 FreeImageData;只需(并必须)在用完后 FreeImagePtr(imgPtr)。FreeImagePtr 也不会替你释放 BMP/PNG 导出缓冲——那是另一套所有权。完整对照见 图像处理模块总览 · 所有权对照。
字节流 / 句柄所有权对照
| 接口 | 对象是什么 | 如何释放 |
|---|---|---|
| GetImageData(本接口) | 句柄内部的 BGRA 像素视图(与 OLAImage 同生命周期) | 只调 FreeImagePtr(imgPtr);禁止 FreeImageData(data) |
| GetImageBmpData | 新分配的完整 BMP 文件字节 | 必须 FreeImageData(data),句柄另调 FreeImagePtr |
| GetImagePngData | 新分配的完整 PNG 文件字节 | 必须 FreeImageData(data),句柄另调 FreeImagePtr |
| FreeImagePtr | 释放 OLAImage 图像句柄 | 不释放上述 BMP/PNG 的 data |
| FreeImageData | 释放独立堆分配的字节缓冲 | 不释放图像句柄 |
| 项目 | 说明 |
|---|---|
| 数据格式 | BGRA(字节顺序 B-G-R-A),每像素 4 字节;width = stride / 4,height = size / stride。 |
| 生命周期 | data 与 OLAImage 句柄绑定,调用 FreeImagePtr 后即失效;写盘或 memcpy 须在释放句柄 之前 完成。 |
| 推荐写法 | GetScreenDataPtr + GetImageData + FreeImagePtr,替代线程不安全的 GetScreenData。 |
| 各语言写盘 | 先将 data 拷贝到语言原生字节数组再落盘(易语言 指针到字节集、C# Marshal.Copy、Python from_address 等)。 |
| 格式 | 若需标准图片文件,优先用 GetImageBmpData 导出 BMP。 |
